class A():
    a = '坎坎坷坷扩扩扩扩扩扩扩'
    "静态函数"
    @staticmethod
    def fool1(name):
        print('hello',name)
        print(A.a)
        # print(A.fool2('kkkkkk'))

    "正常的函数"
    def fool2(self,name):
        return print('hello',name)

    # "类函数"
    # @classmethod
    # def fool3(cls,name):
    #     print('hello',name)
    #     print(A.a)
    #     cls().fool2(name)

if __name__ == '__main__':
    # a = A()
    # a.fool3('kkkkkkk')
    A.fool1('kkkkkkk')
    # a.fool2('kkkkkkk')
    print(A.a)
    # A.fool2('kkkkkkk')
    # a.fool3('klllll')
    # A.fool3('lkkkkk')

"""区别
@staticmethod不需要表示自身对象的self和自身类的cls参数，就跟使用函数一样。
@classmethod也不需要self参数，但第一个参数需要是表示自身类的cls参数55。
如果在@staticmethod中要调用到这个类的一些属性方法，只能直接类名.属性名或类名.方法名。
而@classmethod因为持有cls参数，可以来调用类的属性，类的方法，实例化对象等，避免硬编码。

也就是说在classmethod中可以调用类中定义的其他方法、类的属性，但staticmethod只能通过A.a调用类的属性，但无法通过在该函数内部调用A.foo2()。
"""